﻿// javascript, editar celdas, celdas

#warning Problemas: en el futuro, si modificás la descripción de la cuenta, no se actualizará en los movimientos.

using System;
using System.Collections.Generic;
using Ext.Net;
using Siscont.Contabilidad;
using WebHelper;

namespace IU.Contabilidad.Asiento
{
    /// <summary>
    /// Ingreso de asientos.
    /// </summary>
    public partial class Asiento2 : System.Web.UI.Page
    {
        #region Atributos
        public static string FormatoTotales = "Total debe: ${0}    Total haber: ${1}";

        public List<PreMovimiento> Movimientos
        {
            get { return (List<PreMovimiento>)Session["TempLineasMovs"]; }
            set { Session["TempLineasMovs"] = value; }
        }

        /// <summary>
        /// Para generar el código de los movimientos. Este código se usa para la base
        /// de datos y para identificar los controles dentro del datagrid.
        /// </summary>
        public int TempId
        {
            get { return (int)Session["Tempid"]; }
            set { Session["Tempid"] = value; }
        }

        public object SelectedItem
        {
            get { return Session["ASelit"]; }
            set { Session["ASelit"] = value; }
        }

        public object SelectedId
        {
            get { return Session["ASelid"]; }
            set { Session["ASelid"] = value; }
        }

        /// <summary>
        /// Limpia los datos usados en la sesión.
        /// </summary>
        private void LimpiarDatos()
        {
            Session.Remove("ASelid");
            Session.Remove("ASelit");
            Session.Remove("Tempid");
            Session.Remove("TempLineasMovs");
        }

        #endregion

        #region Métodos de System.Web.UI.Page

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!ContabilidadGlobal.Admin.Permisos.Alta)
            {
                Session["Mensaje"] = "Usted no tiene los permisos para acceder a esta sección.";
                Session["Titulo"] = "Acceso denegado";
                Response.Redirect("../../Mensaje.aspx");
            }
            else if (!X.IsAjaxRequest)
            {
                TempId = 0;
                SelectedItem = null;

                Storer st = new Storer(typeof(PreMovimiento));
                st.ObjectToStore(ref Store1);

                DateFieldAsiento.Value = DateTime.Today;
                CargarDatosEnComboMovs();
                CargarDatosEnComboCuentas();

                Movimientos = new List<PreMovimiento>();

                CargarDatosEnGrid();

#if DEBUG
                GridPanel1.ColumnModel.Columns[0].Hidden = false;
#endif
            }
        }

        #endregion

        #region Datos de controles

        protected void CargarDatosEnComboMovs()
        {
            try
            {
                StoreComboMov.DataSource = ContabilidadGlobal.Admin.ObtenerListaTiposMovimientos();
                StoreComboMov.DataBind();
            }
            catch (Exception ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Error al cargar tipos de movimientos");
            }
        }

        protected void CargarDatosEnComboCuentas()
        {
            try
            {
                StoreCuenta.DataSource = ContabilidadGlobal.Admin.ObtenerListaCuentas3();
                StoreCuenta.DataBind();
            }
            catch (Exception ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Error al cargar cuentas");
            }
        }

        protected void CargarDatosEnGrid()
        {
            try
            {
                Store1.DataSource = Movimientos;
                Store1.DataBind();
            }
            catch (Exception ex)
            {
                UIHelper.MostrarExcepcionSimple(ex, "Error");
            }
        }

        #endregion

        #region Directmethods
        [DirectMethod]
        public void LimpiarBuffer()
        {
            Movimientos.Clear();
        }

        [DirectMethod]
        public void RegistrarTodo(string datos, string descrip, string date)
        {
            try
            {
                /* Limpia movimientos procesados previamente */
                LimpiarBuffer();

                /* Procesa los movimientos */
                string[] lineas = datos.Split('|');
                foreach (string linea in lineas)
                {
                    string[] valor = linea.Split('\r');

                    Movimientos.Add(new PreMovimiento
                    {
                        Cod = int.Parse(valor[0]),
                        Cuenta = valor[1],
                        Descripcion = valor[2],
                        Debe = valor[3],
                        Haber = valor[4]
                    });
                }

                /* Genera y guarda el asiento */
                var cod = ContabilidadGlobal.Admin.GenerarAsiento(
                    descrip,
                    DateTime.Parse(date),
                    Movimientos.ToArray());
                if (cod != -1)
                {
                    Session["cod"] = cod;
                    this.LimpiarDatos();
                    Response.Redirect("AsientoAgregado.aspx");

                }
            }
            catch (Exception ex)
            {
                BotonConfirmar.Show();
                UIHelper.MostrarExcepcionSimple(ex, "Error");
            }
        }

        [DirectMethod]
        protected void BotonConfirmar_Click(object sender, DirectEventArgs e)
        {
            /*var cod = RegistrarAsiento();
            if (cod != -1)
            {
                Session["cod"] = cod;
                Response.Redirect("AsientoAgregado.aspx");
            }*/
        }

        [DirectMethod]
        protected void BotonLimpiar_Click(object sender, DirectEventArgs e)
        {
            this.LimpiarDatos();
            Response.Redirect("Asiento2.aspx");
        }
        
        [DirectMethod]
        protected void OnRowSelect_Event(object sender, DirectEventArgs e)
        {
            SelectedItem = null;
            try
            {
                string json = e.ExtraParams["Values"];
                Dictionary<string, string>[] rows = JSON.Deserialize<Dictionary<string, string>[]>(json);
                SelectedId = rows[0]["id"];
                Storer st = new Storer(typeof(PreMovimiento));
                SelectedItem = st.MakeObjectFromRow(rows);
            }
            catch { }
        }

        #endregion
    }
}
